home *** CD-ROM | disk | FTP | other *** search
- {
- ANDREW WOOLFSON
-
- I recall certain people discussing ways of drawing LINES in Pascal.
- Unfortunately I'v lost the thread of those messages - BUT thought I could
- add my endevours to this same task.
- I hope this helps someone.
-
- }
- Program VGA_Line_Demo;
- (***************************************************************************)
- (* Designed, thought out and programmed by Andrew Woolfson {using TP v6.0} *)
- (* *)
- (* Because you have lost all those handy Borland Graphic Functions, I have *)
- (* had to redesign the second elementary function in graphics : THE LINE *)
- (* This proved very difficult, and so far this program is a example of the *)
- (* best I have managed to do (using vector mathematics). *)
- (* *)
- (* This program also shows VGA direct screen addressing in 320x200x256 *)
- (* mode. *)
- (* *)
- (* I have not documented this program, as I feel it it fairly explanatory. *)
- (* If you Do not understand any routine, dont hesitate to ask. *)
- (* Please share your experiments as I have. *)
- (***************************************************************************)
-
- Uses
- Crt, Graph, DOS;
-
- Var
- x, y, Loop : Integer;
- Key : Char;
- Pixels : Array [0..199,0..319] OF BYTE ABSOLUTE $A000:0000;
- { NOTE: Y & X Coord's have been swapped }
-
- Procedure InitializeVGA;
- Var
- GraphDriver : Integer;
- GraphMode : Integer;
- PathtoDriver : String[8];
- Regs : Registers;
- Begin
- GraphDriver := VGA;
- GraphMode := VGAHi;
- InitGraph(GraphDriver, GraphMode, 'e:\bp\bgi');
-
- Regs.AX := 19;
- intr($10, Regs); { Interrupt 16 }
- End;
-
- Procedure Plot(X, Y, Color : Integer);
- Begin
- Pixels[Y,X] := Color;
- End;
-
- Procedure Line(x1, y1, x2, y2, Color : Integer);
- Var
- Loop,
- tx, ty : Integer;
- Gradiant : Real;
- Begin
- If ((x1 < x2) AND (y1 < y2)) OR
- ((x1 = x2) AND (y1 < y2)) OR
- ((x1 < x2) AND (y1 = y2)) Then
- Begin
- If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Then
- Begin
- Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);
- For Loop := x1 To (x1 + ABS(x2 - x1)) Do
- Plot(Loop, (y1 + trunc((Loop - x1) * Gradiant)), Color);
- End
- else
- Begin
- Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);
- For Loop := y1 To (y1 + ABS(y2 - y1)) Do
- Plot((x1 + trunc((Loop - y1) * Gradiant)), Loop, Color);
- End;
- End;
-
- If (x1 > x2) AND (y1 < y2) Then
- Begin
- If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Then
- Begin
- Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);
- For Loop := x2 To x1 Do
- Plot(Loop, (y1 + trunc((x1 - Loop) * Gradiant)), Color);
- End
- else
- Begin
- Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);
- For Loop := y1 To (y1 + ABS(y2 - y1)) Do
- Plot((x1 + trunc((y1 - Loop) * Gradiant)), Loop, Color);
- End;
- End;
-
- If ((x1 < x2) AND (y1 > y2)) Then
- Begin
- If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Then
- Begin
- Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);
- For Loop := x1 To (x1 + ABS(x2 - x1)) Do
- Plot(Loop, y1 + trunc((x1 - Loop) * Gradiant), color);
- End
- else
- Begin
- ty := y1;
- y1 := y2;
- y2 := ty;
- Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);
- For Loop := y1 To (y1 + ABS(y2 - y1)) Do
- Plot(x2 + trunc((y1 - Loop) * Gradiant), Loop, color);
- End;
- End;
-
- If ((x1 > x2) AND (y1 > y2)) OR
- ((x1 = x2) AND (y1 > y2)) OR
- ((x1 > x2) AND (y1 = y2)) Then
- Begin
- tx := x1;
- ty := y1;
- x1 := x2;
- y1 := y2;
- x2 := tx;
- y2 := ty;
- If (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1) <= 1 Then
- Begin
- Gradiant := (ABS(y2 - y1) + 1) / (ABS(x2 - x1) + 1);
- For Loop := x1 To (x1 + ABS(x2 - x1)) Do
- Plot(Loop, y1 + trunc((Loop - x1) * Gradiant), color);
- End
- else
- Begin
- Gradiant := (ABS(x2 - x1) + 1) / (ABS(y2 - y1) + 1);
- For Loop := y1 To (y1 + ABS(y2 - y1)) Do
- Plot(x1 + trunc((Loop - y1) * Gradiant), Loop, color);
- End;
- End;
-
- End;
-
- Begin
- InitializeVGA;
-
- SetRGBPalette(1,63, 0, 0); { RED }
- SetRGBPalette(2, 0,63, 0); { GREEN }
- SetRGBPalette(3, 0, 0,63); { BLUE }
- SetRGBPalette(4,63,63,63); { WHITE }
-
- For x := 50 To 250 Do
- Line(150, 100, x, 50, 1);
- For y := 50 To 150 Do
- Line(150, 100, 250, y, 2);
- For x := 250 Downto 50 Do
- Line(150, 100, x, 150, 3);
- For y := 150 Downto 50 Do
- Line(150, 100, 50, y, 4);
-
- Readln;
- End.